import * as Cesium from 'cesium';
import * as turf from '@turf/turf';
import * as CesiumCrood from './CesiumCrood'; // 坐标转化方法
/**
 * 封装Cesium计算方法
 * turf 是一个本地计算库，用于地理空间分析
/**
 * 计算左边点的球面距离
 * @param { 笛卡尔坐标数组 Cartesian3[]} positions
 * @param {* 单位：默认千米 string: degrees, radians, miles, kilometers} units
 * @returns { 米 number}
 */
export const distance = function (positions, units = 'kilometers') {
    if (positions.length > 1) {
        const pointList = CesiumCrood.cartesian3ToLonLatHeightArray(positions); // 转化为经纬度坐标
        const line = turf.lineString(pointList);
        const length = turf.length(line, { units: units });
        return length;
    } else {
        return 0;
    }
};

/**
 * 计算坐标点面积
 * @param { 笛卡尔坐标数组 Cartesian3[]} positions
 * @returns { 面积(平方米) number}
 */
export const area = function (positions) {
    const polygon = turf.polygon(positions); // 第一个点与最后一个点为相同
    const area = turf.area(polygon);
    return area;
};

/**
 * 计算多边形中心点（质心）
 * @param { 笛卡尔坐标数组 Cartesian3[]} positions
 * @returns { 几何中心（高度为0）  Cartesian3 }
 */
export const centerOfMass = function (positions) {
    const polygon = turf.polygon(positions); // 第一个点与最后一个点为相同
    const centerPoint = turf.centerOfMass(polygon);
    const coordinates = centerPoint?.geometry?.coordinates;
    // 经纬度坐标转笛卡尔坐标
    return Cesium.Cartesian3.fromDegrees(coordinates[0], coordinates[1], 0);
};

/**
 * 计算圆形面积
 * @param {*} pointPosition 
 * @param {*} radius 
 * @returns 
 */
export const CircleArea = function (pointPosition, radius) {
    const point = CesiumCrood.cartesian3ToLonLatHeight(pointPosition); // 转化为经纬度坐标
    // 创建一个圆
    const center = turf.point([point[0], point[1]]); // 中心点坐标
    const circle = turf.circle(center, radius / 1000, {
        steps: 6400,
        units: 'kilometers', // 半径单位为公里
    });
    // 计算圆的面积
    const area = turf.area(circle); // 得到的单位是平方米
    // console.log("圆形面积", (area / 1000000).toFixed(2)); // 圆的面积（平方公里）
    return area;
};


